home *** CD-ROM | disk | FTP | other *** search
/ Visual Cafe 3 / Visual Cafe 3.ISO / Vcafe / JFC.bin / MacSpinnerUI.java < prev    next >
Text File  |  1998-06-30  |  8KB  |  297 lines

  1. /*
  2.  * @(#)MacSpinnerUI.java    1.4 98/02/02
  3.  *
  4.  * Copyright (c) 1997 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * This software is the confidential and proprietary information of Sun
  7.  * Microsystems, Inc. ("Confidential Information").  You shall not
  8.  * disclose such Confidential Information and shall use it only in
  9.  * accordance with the terms of the license agreement you entered into
  10.  * with Sun.
  11.  *
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
  13.  * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  14.  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  15.  * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
  16.  * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
  17.  * THIS SOFTWARE OR ITS DERIVATIVES.
  18.  *
  19.  */
  20.  
  21. package com.sun.java.swing.plaf.mac;
  22.  
  23. import java.awt.*;
  24. import java.awt.event.*;
  25. import com.sun.java.swing.*;
  26. import com.sun.java.swing.plaf.basic.*;
  27. import com.sun.java.swing.border.*;
  28. import com.sun.java.swing.plaf.*;
  29.  
  30. import java.io.Serializable;
  31.  
  32.  
  33. /**
  34.  * MacSpinner implementation
  35.  * <p>
  36.  * Warning: serialized objects of this class will not be compatible with
  37.  * future swing releases.  The current serialization support is appropriate
  38.  * for short term storage or RMI between Swing1.0 applications.  It will
  39.  * not be possible to load serialized Swing1.0 objects with future releases
  40.  * of Swing.  The JDK1.2 release of Swing will be the compatibility
  41.  * baseline for the serialized form of Swing objects.
  42.  *
  43.  * @author Symantec
  44.  * @author David Bustin
  45.  */
  46. public class MacSpinnerUI extends BasicSpinnerUI
  47. {
  48.     protected Color GS10Color;
  49.     protected Color spinnerFieldBackground;
  50.     protected Color spinnerFieldForeground;
  51.     
  52.     public class RoundedLineBorder extends LineBorder {
  53.         RoundedLineBorder(Color c)    {
  54.             super(c);
  55.             roundedCorners = true;
  56.         }
  57.         public boolean getRoundedCorners() { return roundedCorners; }
  58.     }
  59.   // Shared UI object
  60.   protected static MacSpinnerUI macSpinnerUI = new MacSpinnerUI();
  61.  
  62.   private static Border macInactiveBorder = new EmptyBorder(0,0,0,0);
  63.   private static Point buttonSize = new Point( 13, 13);
  64.  
  65.   public static ComponentUI createUI(JComponent s)  {
  66.     return macSpinnerUI;
  67.   }
  68.   
  69.   public void installUI(JComponent c) {
  70.     Spinner spinner = (Spinner)c;
  71.     installBorder(c);
  72.  
  73.     super.installUI(c);
  74.  
  75.     GS10Color = UIManager.getColor("GrayscaleAppearance10");
  76.     spinnerFieldBackground = UIManager.getColor("Spinner.fieldBackground");
  77.     spinnerFieldForeground = UIManager.getColor("Spinner.fieldForeground");
  78.     
  79.     JButton up = new MacSpinnerButton(new MacArrowIcon(true));
  80.     up.addActionListener( new SpinnerIncrementer(spinner));
  81.  
  82.     JButton down = new MacSpinnerButton(new MacArrowIcon(false));
  83.     down.addActionListener( new SpinnerDecrementer(spinner));
  84.  
  85.     Dimension size = getPreferredSize(c);
  86.  
  87.     RoundedLineBorder lb = new RoundedLineBorder(Color.black);
  88.     up.setBorder(lb);
  89.     down.setBorder(lb);
  90.  
  91.     up.setBounds ( size.width-buttonSize.x, 3, buttonSize.x, buttonSize.y);
  92.     down.setBounds (  size.width-buttonSize.x, buttonSize.y+2, buttonSize.x,buttonSize.y);
  93.     c.setLayout(null);
  94.  
  95.     c.add(up);
  96.     c.add(down);
  97.   }
  98.   
  99.   public void uninstallUI(JComponent c) {
  100.     Border b = c.getBorder();
  101.     if(b == macInactiveBorder)
  102.       c.setBorder(null);
  103.  
  104.     Component[] children = c.getComponents();
  105.     for (int i = 0; i < children.length; i++) {
  106.       if (children[i] instanceof MacSpinnerButton ){
  107.         c.remove(children[i]);
  108.       }
  109.     }
  110.     super.uninstallUI(c);
  111.   }
  112.     
  113.   public void paint(Graphics g, JComponent c) {
  114.     Spinner spinner = ((Spinner)(c));
  115.     Insets bi = spinner.getBorder().getBorderInsets(spinner);
  116.  
  117.     Dimension size = c.getSize();
  118.     Color back = spinner.getBackground();
  119.     g.setColor(back);
  120.     g.fillRect(bi.left,bi.top,size.width-(bi.left+bi.right),size.height-(bi.top+bi.bottom));   
  121.  
  122.     final int offset = 4;
  123.     Dimension spinnerArea = getMinimumSize(c);
  124.     bi.top += offset;
  125.     spinnerArea.height += offset;
  126.     paintSpinnerArea(g, spinner, spinnerArea, bi);
  127.  
  128.     int entryWidth = spinnerArea.width;
  129.     int entryHeight = spinnerArea.height + bi.top;
  130.  
  131.     g.setColor(GS10Color);
  132.     g.drawRect( 0, offset, entryWidth, entryHeight-offset-offset);
  133.   }
  134.  
  135.   protected void paintSpinnerArea(Graphics g, Spinner spinner, Dimension d, Insets bi) 
  136.     {
  137.     if (spinner.hasFocus()) 
  138.         {
  139.         g.setColor(getFocusColor());
  140.         g.fillRect(bi.left+2, bi.top+2, d.width-(bi.left+bi.right+4), d.height-(bi.top+bi.bottom+4));
  141.         g.setColor(spinnerFieldForeground);
  142.         }
  143.     else
  144.         {
  145.         Color forG = spinner.getForeground(); 
  146.         g.setColor(forG);
  147.         }
  148.     
  149.     String s;
  150.     if(spinner instanceof StringSpinner)
  151.         {
  152.           StringSpinner spinner2 = ((StringSpinner)(spinner));
  153.           s = spinner2.getValueName() + (spinner2.getText()!=null ? spinner2.getText() : "");
  154.  
  155.         if (spinner2.getTypedString()==null)
  156.               {
  157.             g.drawString(s, bi.left+2, ascent + bi.top+2);
  158.               }
  159.           else  
  160.             {
  161.             g.setColor(spinnerFieldForeground);
  162.             g.drawString(s, bi.left+2, ascent+bi.top+2);
  163.             g.setColor(Color.white);
  164.             g.drawString(s.substring(0,spinner2.getTypedString().length()),bi.left+2 , ascent+bi.top+2);
  165.             }
  166.         }
  167.     else
  168.         {
  169.         s = Integer.toString(spinner.getValue());
  170.       
  171.         if (spinner.getLeadingPad() != -1)
  172.             {
  173.             int j = spinner.getDigits()-s.length();
  174.             String lp = Integer.toString(spinner.getLeadingPad());
  175.             for(int i=0; i<j; i++) 
  176.                 { s = lp +s;}
  177.             }
  178.         s += (spinner.getText()!=null ? spinner.getText() : "");
  179.         g.drawString(s, d.width-fm.stringWidth(s) - bi.right-2, ascent + bi.top+2); // fixed bug
  180.         }
  181.     }
  182.  
  183.   protected void installBorder (JComponent c) {
  184.    Border b = c.getBorder();
  185.     if( b == null)
  186.       c.setBorder(macInactiveBorder);
  187.   }
  188.  
  189.   public Dimension getPreferredSize(JComponent c) {
  190.     Dimension size = getMinimumSize(c);
  191.     size.width += 20;
  192.     size.height +=10;
  193.     return size;
  194.   }
  195.  
  196.   public Dimension getMaximumSize(JComponent c) 
  197.   {
  198.     return getMinimumSize(c);
  199.   }
  200.  
  201.   public Dimension getMinimumSize(JComponent c) 
  202.   {
  203.     Spinner s = ((Spinner)(c));
  204.     fm = s.getFontMetrics(s.getFont());
  205.     int w=0;
  206.     
  207.     if (s instanceof StringSpinner)
  208.         {
  209.         StringSpinner s2 = ((StringSpinner)(s));
  210.     
  211.         String[] names = s2.getNameArray();
  212.         if (names != null)    // maybe null during initialization
  213.             {
  214.             for (int i = names.length; --i>=0; ) 
  215.                 {
  216.                 int tw = fm.stringWidth(names[i]);
  217.                 if (tw>w) 
  218.                     w = tw;
  219.                 }
  220.             }
  221.         else
  222.             w = fm.stringWidth("0")*s.getDigits();
  223.         }
  224.     else
  225.         {
  226.         w = fm.stringWidth("0")*s.getDigits();
  227.         }
  228.  
  229.     if (s.getText()!=null) 
  230.         w+=fm.stringWidth(s.getText());
  231.     Insets bi = s.getBorder().getBorderInsets(s);
  232.     d = new Dimension(w+bi.left+bi.right+4, fm.getHeight()+bi.top+bi.bottom+4);
  233.     ascent = fm.getAscent();
  234.     return d;
  235.   }
  236.  
  237.   protected Color getFocusColor() {
  238.       return spinnerFieldBackground;
  239.   }
  240.  
  241.  
  242. }
  243.  
  244.  
  245. class MacSpinnerButton extends MacAutoRepeatButton {
  246.  
  247.  
  248.   public MacSpinnerButton (Icon icon) {
  249.     super(icon);
  250.   }
  251.  
  252.   public boolean isFocusTraversable() {  // here to prevent focus aquisition
  253.     return false;
  254.   }
  255.   public void requestFocus() {} // stubbed to prevent focus aquisition
  256. }
  257.  
  258.  
  259. abstract class SpinnerAdaptor implements ActionListener {
  260.  
  261.   protected Spinner spinner;
  262.  
  263.   public SpinnerAdaptor(Spinner s) {
  264.     spinner = s;
  265.   }
  266.  
  267. }
  268.  
  269. class SpinnerIncrementer extends SpinnerAdaptor {
  270.  
  271.  
  272.   public SpinnerIncrementer(Spinner s) {
  273.     super(s);
  274.   }
  275.  
  276.   public void actionPerformed(ActionEvent e) {
  277.       int value = spinner.getValue();
  278.       int inc = spinner.getUnitIncrement();
  279.       value += inc;
  280.       spinner.setValue(value);
  281.   }
  282. }
  283.  
  284. class SpinnerDecrementer extends SpinnerAdaptor {
  285.  
  286.   public SpinnerDecrementer(Spinner s) {
  287.     super(s);
  288.   }
  289.  
  290.   public void actionPerformed(ActionEvent e) {
  291.      int value = spinner.getValue();
  292.       int inc = spinner.getUnitIncrement();
  293.       value -= inc;
  294.       spinner.setValue(value);
  295.   }
  296. }
  297.